package controllers

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"

	"dcarpai-guider/internal/services"
)

// UserController 用户管理控制器
type UserController struct {
	userService   *services.UserService
	logger        *zap.Logger
	loggerService *services.LoggerService
}

// NewUserController 创建新的用户管理控制器
func NewUserController(userService *services.UserService, logger *zap.Logger, loggerService *services.LoggerService) *UserController {
	return &UserController{
		userService:   userService,
		logger:        logger,
		loggerService: loggerService,
	}
}

// GetAllUsers 获取所有用户（管理员功能）
// @Summary 获取所有用户
// @Description 获取系统中所有用户的列表（需要管理员权限）
// @Tags 用户管理
// @Produce json
// @Security BearerAuth
// @Success 200 {array} models.UserResponse
// @Failure 401 {object} map[string]interface{}
// @Failure 403 {object} map[string]interface{}
// @Failure 500 {object} map[string]interface{}
// @Router /admin/users [get]
func (uc *UserController) GetAllUsers(c *gin.Context) {
	users, err := uc.userService.GetAllUsers()
	if err != nil {
		uc.logger.Error("获取用户列表失败", zap.Error(err))
		c.JSON(http.StatusInternalServerError, gin.H{
			"code":    500,
			"message": "获取用户列表失败",
			"error":   err.Error(),
		})
		return
	}

	uc.logger.Info("管理员获取用户列表",
		zap.String("admin", c.GetString("username")),
		zap.Int("user_count", len(users)),
	)

	c.JSON(http.StatusOK, gin.H{
		"code":    200,
		"message": "获取用户列表成功",
		"data":    users,
	})
}

// CreateUserRequest 创建用户请求结构
type CreateUserRequest struct {
	Username string `json:"username" binding:"required"`
	Password string `json:"password" binding:"required"`
	Role     string `json:"role" binding:"required"`
	Email    string `json:"email,omitempty"`
}

// CreateUser 创建新用户（管理员功能）
// @Summary 创建用户
// @Description 创建一个新用户（需要管理员权限）
// @Tags 用户管理
// @Accept json
// @Produce json
// @Security BearerAuth
// @Param user body CreateUserRequest true "用户信息"
// @Success 201 {object} models.UserResponse
// @Failure 400 {object} map[string]interface{}
// @Failure 403 {object} map[string]interface{}
// @Failure 500 {object} map[string]interface{}
// @Router /admin/users [post]
func (uc *UserController) CreateUser(c *gin.Context) {
	var req CreateUserRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		uc.logger.Warn("创建用户请求参数错误", zap.Error(err))
		c.JSON(http.StatusBadRequest, gin.H{
			"code":    400,
			"message": "请求参数错误",
			"error":   err.Error(),
		})
		return
	}

	// 基本验证
	if req.Username == "" || req.Password == "" || req.Role == "" {
		c.JSON(http.StatusBadRequest, gin.H{
			"code":    400,
			"message": "用户名、密码和角色不能为空",
		})
		return
	}

	// 验证角色
	if req.Role != "admin" && req.Role != "user" {
		c.JSON(http.StatusBadRequest, gin.H{
			"code":    400,
			"message": "角色必须是 admin 或 user",
		})
		return
	}

	// 验证密码强度（简单验证）
	if len(req.Password) < 6 {
		c.JSON(http.StatusBadRequest, gin.H{
			"code":    400,
			"message": "密码长度至少6位",
		})
		return
	}

	user, err := uc.userService.CreateUser(req.Username, req.Password, req.Role, req.Email)
	if err != nil {
		uc.logger.Error("创建用户失败",
			zap.String("username", req.Username),
			zap.String("role", req.Role),
			zap.Error(err),
		)
		c.JSON(http.StatusInternalServerError, gin.H{
			"code":    500,
			"message": "创建用户失败",
			"error":   err.Error(),
		})
		return
	}

	uc.logger.Info("管理员创建用户成功",
		zap.String("admin", c.GetString("username")),
		zap.String("new_username", req.Username),
		zap.String("role", req.Role),
	)

	c.JSON(http.StatusCreated, gin.H{
		"code":    201,
		"message": "创建用户成功",
		"data":    user,
	})
}

// GetUserStats 获取用户统计信息（管理员功能）
// @Summary 获取用户统计
// @Description 获取用户统计信息，如总用户数、管理员数等（需要管理员权限）
// @Tags 用户管理
// @Produce json
// @Security BearerAuth
// @Success 200 {object} map[string]interface{}
// @Failure 403 {object} map[string]interface{}
// @Failure 500 {object} map[string]interface{}
// @Router /admin/users/stats [get]
func (uc *UserController) GetUserStats(c *gin.Context) {
	users, err := uc.userService.GetAllUsers()
	if err != nil {
		uc.logger.Error("获取用户统计失败", zap.Error(err))
		c.JSON(http.StatusInternalServerError, gin.H{
			"code":    500,
			"message": "获取用户统计失败",
			"error":   err.Error(),
		})
		return
	}

	// 统计用户信息
	stats := map[string]interface{}{
		"total_users":  len(users),
		"admin_count":  0,
		"user_count":   0,
		"active_users": 0, // 有最后登录时间的用户
	}

	for _, user := range users {
		if user.Role == "admin" {
			stats["admin_count"] = stats["admin_count"].(int) + 1
		} else {
			stats["user_count"] = stats["user_count"].(int) + 1
		}

		if user.LastLogin != "" {
			stats["active_users"] = stats["active_users"].(int) + 1
		}
	}

	uc.logger.Info("管理员获取用户统计",
		zap.String("admin", c.GetString("username")),
		zap.Int("total", len(users)),
	)

	c.JSON(http.StatusOK, gin.H{
		"code":    200,
		"message": "获取用户统计成功",
		"data":    stats,
	})
}
